تعلم MATLAB في 10 دقائق
MATLAB (مختبر المصفوفات) هي لغة برمجة عالية المستوى وبيئة مصممة للحوسبة العددية وتطوير الخوارزميات وتصور البيانات. تم تطويرها في أواخر السبعينيات، أصبحت MATLAB أداة أساسية في الهندسة والعلوم والرياضيات.
سأغطي لك أساسيات MATLAB وأبدأ معك في استكشاف هذه البيئة القوية للحوسبة.
1. برنامج MATLAB الأول
أنشئ ملفًا نصيًا hello.m أو اكتب الأوامر مباشرة في نافذة أوامر MATLAB.
disp('Hello, World!')
أو باستخدام دالة fprintf:
fprintf('Hello, World!\n')
سيكون الناتج:
Hello, World!
دالة disp() تعرض المحتوى مباشرة، بينما توفر fprintf() تحكماً أكبر في التنسيق، مشابهاً لـ printf في لغة C.
2. الصياغة الأساسية
لـ MATLAB قواعد صياغة خاصة بها تختلف عن معظم لغات البرمجة العامة. فهم هذه الأساسيات ضروري لكتابة كود نظيف وقابل للصيانة.
2.1 التعليقات
التعليقات السطر الواحد تبدأ بعلامة النسبة المئوية %:
% هذا تعليق
x = 10; % هذا يعين القيمة 10 لـ x
التعليقات متعددة الأسطر تستخدم %{ و %}:
%{
هذا تعليق متعدد الأسطر.
يمتد عبر عدة أسطر.
%}
2.2 الفاصلة المنقوطة
الفاصلة المنقوطة ; تمنع عرض الناتج. بدونها، يعرض MATLAB النتيجة:
x = 5 % يعرض: x = 5
y = 10; % لا يوجد ناتج، لكن y تم تعيينها
2.3 حساسية حالة الأحرف
MATLAB حساسة لحالة الأحرف. A و a هما متغيران مختلفان:
A = 5;
a = 10;
disp(A) % الناتج: 5
disp(a) % الناتج: 10
2.4 تسمية المتغيرات
يجب أن تبدأ أسماء المتغيرات بحرف، ثم تتبعها أحرف أو أرقام أو شرطات سفلية:
valid_name = 1;
another_valid_name_123 = 2;
% 123invalid = 3; % خطأ: لا يمكن أن تبدأ برقم
2.5 العمليات الأساسية
تتميز MATLAB بعمليات المصفوفات. إنشاء مصفوفة بسيط:
A = [1 2 3; 4 5 6; 7 8 9] % مصفوفة 3x3
الناتج:
A =
1 2 3
4 5 6
7 8 9
3. المتغيرات وأنواع البيانات
تستخدم MATLAB كتابة ديناميكية. يتم إنشاء المتغيرات عند تعيينها ويتم تحديد نوعها بواسطة القيمة المعينة.
3.1 الأنواع العددية
تخزن MATLAB جميع الأرقام كفاصلة عائمة مزدوجة الدقة افتراضياً:
% عدد صحيح
int_num = 42;
% عدد عشري
float_num = 3.14159;
% التدوين العلمي
sci_num = 2.5e-3; % 0.0025
3.2 السلاسل النصية
المتغيرات النصية تستخدم علامات اقتباس مفردة:
str = 'Hello, MATLAB';
str2 = "Hello, MATLAB"; % مصفوفة نصية (R2016b+)
سلسلة النصوص:
str1 = 'Hello';
str2 = 'World';
combined = [str1 ', ' str2]; % 'Hello, World'
3.3 المنطقي (Boolean)
القيم المنطقية هي true أو false:
flag = true;
result = false;
% العمليات المنطقية
a = true;
b = false;
and_result = a && b; % false
or_result = a || b; % true
not_result = ~a; % false
3.4 مصفوفات الأحرف مقابل السلاسل النصية
لدى MATLAB كلاً من مصفوفات الأحرف وكائنات السلاسل النصية:
% مصفوفة أحرف (النمط القديم)
char_arr = 'Hello';
% كائن سلسلة نصية (النمط الحديث، R2016b+)
str_obj = "Hello";
% كائنات السلسلة النصية أسهل في التعامل
name = "Alice";
greeting = "Hello, " + name; % تعمل بشكل طبيعي
4. هياكل البيانات
توفر MATLAB عدة هياكل بيانات لحالات استخدام مختلفة.
4.1 المتجهات
المتجه هو مصفوفة أحادية البعد:
% متجه صف
row_vec = [1 2 3 4 5];
% متجه عمود
col_vec = [1; 2; 3; 4; 5];
% استخدام عامل النقطتين
range_vec = 1:5; % [1 2 3 4 5]
step_vec = 0:2:10; % [0 2 4 6 8 10]
% linspace للقيم المتساوية التباعد
lin_vec = linspace(0, 10, 5); % [0 2.5 5 7.5 10]
4.2 المصفوفات
المصفوفات هي أساس MATLAB:
% إنشاء مصفوفة مباشرة
A = [1 2 3; 4 5 6; 7 8 9];
% الوصول للعناصر
element = A(2, 3); % يُرجع 6 (صف 2، عمود 3)
% عمليات المصفوفة
B = A'; % التحويل
C = A * B; % ضرب المصفوفات
D = A .* B; % ضرب العنصر بعنصر
4.3 مصفوفات الخلية
يمكن لمصفوفات الخلية الاحتفاظ بأنواع مختلفة من البيانات:
% إنشاء مصفوفة خلية
cell_arr = {1, 'hello', [1 2 3], true};
% الوصول لمحتويات الخلية باستخدام الأقواس المتعرجة
data = cell_arr{2}; % يُرجع 'hello'
% الوصول للخلية باستخدام الأقواس
sub_cell = cell_arr(1:2); % يُرجع {1, 'hello'}
4.4 الهياكل
الهياكل تشبه القواميس مع حقول محددة بالأسماء:
% إنشاء هيكل
student.name = 'John';
student.age = 20;
student.major = 'Engineering';
% الوصول للحقول
disp(student.name); % الناتج: John
% مصفوفة من الهياكل
students(1).name = 'Alice';
students(1).age = 21;
students(2).name = 'Bob';
students(2).age = 22;
4.5 الجداول
الجداول مناسبة للبيانات الجدولية:
% إنشاء جدول
Age = [25; 30; 35];
Name = {'Alice'; 'Bob'; 'Charlie'};
Salary = [50000; 60000; 70000];
T = table(Name, Age, Salary);
% الوصول للبيانات
disp(T.Age);
disp(T.Name{1});
5. العمليات
توفر MATLAB عمليات مختلفة للحساب والمقارنة والمنطق.
5.1 العمليات الحسابية
a = 10;
b = 3;
sum = a + b; % 13
diff = a - b; % 7
prod = a * b; % 30
quot = a / b; % 3.3333
int_div = floor(a/b); % 3
mod = mod(a, b); % 1 (الباقي)
pow = a ^ b; % 1000
5.2 العمليات العنصرية
العمليات العنصرية تعمل على العناصر المقابلة:
A = [1 2 3];
B = [4 5 6];
C = A .* B; % عنصري: [4 10 18]
D = A.^2; % تربيع عنصري: [1 4 9]
5.3 عمليات المقارنة
x = 5;
y = 10;
eq = (x == y); % false
neq = (x ~= y); % true
gt = (x > y); % false
lt = (x < y); % true
ge = (x >= y); % false
le = (x <= y); % true
5.4 العمليات المنطقية
a = true;
b = false;
and_op = a & b; % false (AND عنصري)
or_op = a | b; % true (OR عنصري)
not_op = ~a; % false
and_short = a && b; % false (AND مختصر)
or_short = a || b; % true (OR مختصر)
6. التحكم في التدفق
توفر MATLAB هياكل تحكم في التدفق القياسية، لكن بصياغة مختلفة عن لغات مثل Python.
6.1 if-elseif-else
score = 85;
if score >= 90
grade = 'A';
elseif score >= 80
grade = 'B';
elseif score >= 70
grade = 'C';
else
grade = 'F';
end
disp(grade) % الناتج: B
6.2 switch
عبارة switch تقارن تعبيراً واحداً مع حالات متعددة:
day = 'Monday';
switch day
case {'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'}
disp('Weekday');
case {'Saturday', 'Sunday'}
disp('Weekend');
otherwise
disp('Invalid day');
end
6.3 حلقات for
حلقة for تتكرر على نطاق أو مصفوفة:
% التكرار على نطاق
for i = 1:5
disp(i);
end
% التكرار على مصفوفة
fruits = {'apple', 'banana', 'orange'};
for fruit = fruits
disp(fruit{1});
end
% حلقات متداخلة لعمليات المصفوفة
A = [1 2; 3 4];
B = zeros(2, 2);
for i = 1:2
for j = 1:2
B(i, j) = A(i, j) * 2;
end
end
6.4 حلقات while
count = 0;
while count < 5
disp(count);
count = count + 1;
end
6.5 التحكم في الحلقات
عبارة break تخرج من الحلقة، و continue تقفز للتكرار التالي:
% استخدام break
for i = 1:10
if i == 5
break;
end
disp(i);
end
% الناتج: 1 2 3 4
% استخدام continue
for i = 1:5
if mod(i, 2) == 0
continue; % تخطي الأرقام الزوجية
end
disp(i);
end
% الناتج: 1 3 5
7. الإدخال والإخراج
7.1 إدخال المستخدم
استخدم دالة input() للحصول على إدخال المستخدم:
% الحصول على إدخال عددي
num = input('Enter a number: ');
% الحصول على إدخال نصي
name = input('Enter your name: ', 's');
% الحصول على إدخال تعبير (يقيم الإدخال)
expr = input('Enter an expression: ');
7.2 عرض الناتج
عدة دوال لعرض الناتج:
% disp - عرض بسيط
disp('Hello');
disp([1 2 3]);
% fprintf - عرض منسق
name = 'Alice';
age = 25;
fprintf('Name: %s, Age: %d\n', name, age);
% sprintf - إنشاء سلسلة منسقة
str = sprintf('Value: %.2f', 3.14159);
disp(str);
7.3 محددات التنسيق
محددات التنسيق الشائعة في MATLAB:
% %s - سلسلة نصية
% %d - عدد صحيح
% %f - فاصلة عائمة
% %.2f - فاصلة عائمة برقمين عشريين
% %e - تدوين علمي
fprintf('%d %.2f %e\n', 42, 3.14159, 1000)
% الناتج: 42 3.14 1.000000e+03
8. الدوال
الدوال في MATLAB تُعرّف عادة في ملفات منفصلة، لكن الدوال المجهولة توفر إنشاء دوال مضمنة.
8.1 الدوال المجهولة
الدوال المجهولة تنشئ دوال بسيطة بدون ملفات منفصلة:
% إدخال واحد
square = @(x) x^2;
disp(square(5)); % الناتج: 25
% إدخالات متعددة
add = @(x, y) x + y;
disp(add(3, 4)); % الناتج: 7
% تعبيرات متعددة
hypot = @(x, y) sqrt(x^2 + y^2);
disp(hypot(3, 4)); % الناتج: 5
8.2 ملفات الدوال
أنشئ ملفًا myfunc.m:
function y = myfunc(x)
y = x^2 + 1;
end
استدعاء الدالة:
result = myfunc(5); % الناتج: 26
8.3 دوال بمخرجات متعددة
function [sum, prod] = calc(x, y)
sum = x + y;
prod = x * y;
end
استدعاء بمخرجات متعددة:
[s, p] = calc(3, 4);
disp(s); % 7
disp(p); % 12
8.4 وسطاء متغيرون
استخدم varargin و varargout للوسطاء المتغيرين:
function result = sum_all(varargin)
result = 0;
for i = 1:length(varargin)
result = result + varargin{i};
end
end
% استدعاء بأي عدد من الوسطاء
total = sum_all(1, 2, 3, 4, 5); % الناتج: 15
9. ملفات السكربت
الملفات النصية هي ملفات .m تحتوي على سلسلة من أوامر MATLAB. تعمل على البيانات في مساحة العمل:
% احفظ كـ myscript.m
% حساب الإحصائيات لمجموعة بيانات
data = [1 2 3 4 5 6 7 8 9 10];
mean_val = mean(data);
std_val = std(data);
max_val = max(data);
min_val = min(data);
fprintf('Mean: %.2f\n', mean_val);
fprintf('Std: %.2f\n', std_val);
fprintf('Max: %d\n', max_val);
fprintf('Min: %d\n', min_val);
10. معالجة الأخطاء
استخدم try-catch لمعالجة الأخطاء:
try
result = risky_operation();
catch ME
fprintf('Error: %s\n', ME.message);
% معالجة الخطأ
result = 0;
end
استخدام error() لإثارة الأخطاء:
function result = divide(a, b)
if b == 0
error('Division by zero is not allowed');
end
result = a / b;
end
11. عمليات الملفات
11.1 حفظ وتحميل البيانات
% حفظ المتغيرات في ملف
x = [1 2 3];
y = 'hello';
save('data.mat', 'x', 'y');
% تحميل المتغيرات من ملف
load('data.mat');
% حفظ في ملف نصي
writematrix(x, 'data.txt');
% قراءة من ملف نصي
data = readmatrix('data.txt');
11.2 عمليات الملفات النصية
% كتابة في ملف نصي
fid = fopen('output.txt', 'w');
fprintf(fid, 'Line 1\n');
fprintf(fid, 'Line 2\n');
fclose(fid);
% قراءة من ملف نصي
fid = fopen('output.txt', 'r');
while ~feof(fid)
line = fgetl(fid);
if ischar(line)
disp(line);
end
end
fclose(fid);
استخدام textscan للقراءة المهيكلة:
fid = fopen('data.txt', 'r');
format = '%s %d %f';
C = textscan(fid, format);
fclose(fid);
name = C{1};
age = C{2};
score = C{3};
12. الرسم
قدرات الرسم في MATLAB هي من أقوى ميزاتها.
12.1 الرسم ثنائي الأبعاد الأساسي
x = 0:0.1:2*pi;
y = sin(x);
plot(x, y);
xlabel('x');
ylabel('sin(x)');
title('Sine Wave');
grid on;
12.2 رسوم متعددة
x = 0:0.1:2*pi;
% رسوم فرعية
subplot(2, 1, 1);
plot(x, sin(x));
title('Sine');
subplot(2, 1, 2);
plot(x, cos(x));
title('Cosine');
12.3 تخصيص الرسوم
x = 0:0.1:10;
y1 = x;
y2 = x.^2;
plot(x, y1, 'b-', 'LineWidth', 2); % خط أزرق متصل
hold on;
plot(x, y2, 'r--', 'LineWidth', 2); % خط أحمر متقطع
hold off;
xlabel('X');
ylabel('Y');
legend('Linear', 'Quadratic');
title('Linear vs Quadratic');
grid on;
12.4 أنواع رسوم أخرى
% مخطط شريطي
bar([1 2 3 4], [10 20 15 25]);
% مدرج تكراري
data = randn(1000, 1);
histogram(data, 30);
% مخطط مبعثر
x = rand(100, 1);
y = 2*x + randn(100, 1)*0.1;
scatter(x, y);
